package com.system.manager.common.entity;

import com.system.manager.modules.authorized.entity.User;
import com.system.manager.modules.authorized.vo.UserVo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;

/**
 * @Classname ExampleExclTemplate
 * @Description TODO 系统用户excl模板
 * @Date 2021/11/13 10:09
 * @Created by 杨小鹏：【241960695@qq.com】
 */
@Data
@AllArgsConstructor
@Slf4j
public class UserExclTemplate extends ExclTemplate {


    private Object objectTemplate;

    public void setObjectTemplate(Object objectTemplate){
        this.objectTemplate = objectTemplate;
    }

    /**
     * 自定义构造函数，创建对应的Excel模板
     * @param templateName 模板名
     * @param objectTemplate
     */
    public UserExclTemplate(String templateName, Object objectTemplate){
        setTemplateName(templateName);
        setTemplateContent(objectTemplate);
        setObjectTemplate(objectTemplate);
    }

    @Override
    public boolean isValid(Sheet sheet) {
        // 4.获取当前页的第一行
        Row headerRow = sheet.getRow(0);
        // 5.判断模板是否正确
        for(int i = 0; i < this.templateContent.length; i++){
            // 5.1判断每一列的值是否对应
            if(!headerRow.getCell(i).getStringCellValue().equals(this.templateContent[i])){
                // 5.2不对应，直接返回false
                return false;
            }
        }

        return true;
    }

    @Override
    public void setTemplateName(String templateName) {
        this.templateName = templateName;
    }

    @Override
    public void setTemplateContent(Object templateObject){

        // 1.获取当前对象的class对象
        Class userClass = templateObject.getClass();

        // 2.获取对应的属性
        Field[] userFields = userClass.getDeclaredFields();
        this.templateContent = new String[userFields.length];

        // 3.将user对象的属性赋值给当前模板
        for(int i = 0; i < userFields.length; i++){
            userFields[i].setAccessible(true);
            // 获取当前属性的值
            try {
                this.templateContent[i] = (String)userFields[i].get(templateObject);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        }
    }

    @Override
    public Object createTemplateObject(Row row) {

        // 1.获取当前对象的class对象
        Class userClass = this.objectTemplate.getClass();

        // 2.获取对应的属性
        Field[] userFields = userClass.getDeclaredFields();

        // 3.根据row获取每一列的值
        Object currValue = null;
        for(int i = 0; i < templateContent.length; i++){
            // 3.1获取当前属性的值
            try {
                // 3.1.1 判断当前格式的值是否是String
                currValue = row.getCell(i).getStringCellValue();
            } catch (Exception e) {
                e.printStackTrace();
                // 3.1.2 判断当前格式的值是否是Integer
                currValue = row.getCell(i).getNumericCellValue();
            }
            try {
                userFields[i].setAccessible(true);
                // 判断当前列的值是否是字符串
                userFields[i].set(objectTemplate, currValue);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }

        }
        // 返回生成的对象
        return this.objectTemplate;
    }

}
